package co.edu.udea.iw.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.iw.dao.UsuarioDAO;
import co.edu.udea.iw.dto.TipoDocumento;
import co.edu.udea.iw.dto.Usuario;
import co.edu.udea.iw.exception.IWDaoException;

/**
 * Clase que hereda de HibernateDaoSupport e implementa (sobrescribe) los
 * metodos del dao del usuario
 * 
 * @author Santiago Ruiz
 * @author Bladimir Velez
 *
 */
public class UsuarioDAOImpl extends HibernateDaoSupport implements UsuarioDAO {

	/**
	 * Entrega los datos de un usuario dado su identificador
	 * 
	 * @param numeroDocumento
	 *            int identificador del numero de documento y tipoDocumento
	 *            TipoDocumento identificador del tipo de documento
	 * @return instancia con los datos del usuario obtenido, si no existe el
	 *         tipoDispositivo retorna null.
	 * @throws IWDaoException
	 */
	@Override
	public Usuario obtenerUsuario(int numeroDocumento,
			TipoDocumento tipoDocumento) throws IWDaoException {
		Session session = null;
		Usuario usuario = null;

		try {
			session = getSession();
			usuario = (Usuario) session.get(Usuario.class, new Usuario(
					numeroDocumento, tipoDocumento));

		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		return usuario;
	}

	/**
	 * Entrega la lista de todos los usuarios existentes en base de datos
	 * 
	 * @return lista usuarios
	 * @throws IWDaoException
	 */
	@Override
	public List<Usuario> obtenerUsuarios() throws IWDaoException {
		Session session = null;
		List<Usuario> usuarios = new ArrayList<Usuario>();

		try {
			session = getSession();
			Criteria criteria = session.createCriteria(Usuario.class);
			usuarios = criteria.list();

		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		return usuarios;
	}

	/**
	 * Agrega un usuario
	 * 
	 * @param usuario
	 *            Usuario a agregar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void agregarUsuario(Usuario usuario) throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.save(usuario);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}

	/**
	 * Elimina un usuario
	 * 
	 * @param usuario
	 *            Usuario a eliminar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void eliminarUsuario(Usuario usuario) throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.delete(usuario);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}

	/**
	 * Actualiza un usuario
	 * 
	 * @param usuario
	 *            Usuario a actualizar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void actualizarUsuario(Usuario usuario) throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.update(usuario);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}

}
